package hight;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockTest3 {
    // ReentrantLock可以用来替代Synchroized,在需要同步的代码块加锁，最后一定要释放所，否则其他线程永远
    // 可以使用Condition来替代wait和notify来进行线程见的通讯，Condition只针对某一把锁
    // 一个Lock可以创建多个Condition，更加灵活
    // Lock的其他方法
    // tryLock() 尝试获得锁，返回true/false
    // tryLock(timeout,unit) 在给定时间内尝试获得锁
    // siFair() 判断是否为公平锁
    // isLocked() 当前线程是否持有锁
    // lock.getHoldCount() 持有锁的数量，只能在当前调用线程内容使用，不能在其他线程中使用
    
    private ReentrantLock lock = new ReentrantLock();

    public void run1() {
        try {
            lock.lock();
            System.out.println("当前线程：" + Thread.currentThread().getName() +
                    " 持有锁." + lock.getHoldCount());
            run2();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            lock.unlock();
        }
    }
    public void run2() {
        try {
            lock.lock();
            System.out.println("当前线程：" + Thread.currentThread().getName() + " 持有锁." + lock.getHoldCount());
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        ReentrantLockTest3 reentrantLockTest1 = new ReentrantLockTest3();
        reentrantLockTest1.run1();
    }
}
